﻿using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using System;

namespace ZhaoXi_Core_WebApi.Utility
{
    /// <summary>
    /// 自定义的异常处理
    /// 可以在action上注册，也可在Controller上注册
    /// 全局注册在startup的ConfiguraService里面注册
    /// </summary>
    public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly ILogger<CustomExceptionFilterAttribute> _logger;
        private readonly IWebHostEnvironment _env;


        //一个类可以定义多个构造函数 在new一个对象时选择调用那个构造函数，构造函数可以重载
        //public CustomExceptionFilterAttribute()//为了方便标记，特定此处无参构造函数
        //{
        //}
        //报错 ：System.InvalidOperationException:在类型“ZhaoXi_Core_WebApi.Utility.CustomExceptionFilterAttribute”
        //中找到多个接受所有给定参数类型的构造函数。应该只有一个适用的构造函数。


        public CustomExceptionFilterAttribute(ILogger<CustomExceptionFilterAttribute> logger) //该异常过滤器的构造函数，实现依赖注入
        {
            _logger = logger;
        }


        public override void OnException(ExceptionContext filterContext) //重写OnException方法（ExceptionFilterAttributeF12进去看到虚方法virtual就是我们需要的）
        {
            Console.WriteLine($"异常过滤器CustomActionFilterAttribute的OnException执行了，时间{DateTime.Now}");


            //filterContext.Exception.StackTrace;//堆栈信息
            Exception ex = filterContext.Exception;
            string errorMsg = $"错误消息:{ex.Message}{Environment.NewLine}错误追踪:{ex.StackTrace}";
            _logger.LogError(errorMsg);


            //if (filterContext.ExceptionHandled == false) 和下面这一个同一个意思
            if (!filterContext.ExceptionHandled) //如果这个异常没有被处理 注意：这里在处理异常情况时候， 一点要1.先判断该异常是否被处理 (处理：程序里面是否已经白try catch抓住了)
            {
                filterContext.Result = new JsonResult(new   //这里是写的比较简陋的，仅供参考思路。（这里就返回一个json,其实还可以返回视图）
                {
                    Result = false,
                    Msg = "系统发生错误",
                    Error = filterContext.HttpContext.Request.Path,
                    DebugMessage = filterContext.Exception.Message ////中断式---请求到这里结束了，不再继续Action
                });



                filterContext.ExceptionHandled = true;//2.异常已经被处理以后一定要把ExceptionHandled设置为true;表示已经处理过了
            }
        }




        //public override Task OnExceptionAsync(ExceptionContext context)//异步方法，现在action里面的方法都不是async的，就暂时不用这个方法
        //{
        //}
    }
}